/**
 * 双指针
 * left,right
 * 当left是字母且right是字母时，将s[left]和s[right]转为小写比较，如果不一样则不是
 * 直到left和right相遇，返回true
 * @param {*} s
 */
// var isPalindrome = function (s) {
//   let left = 0,
//     right = s.length - 1
//   while (left < right) {
//     const leftChar = s[left].toLowerCase()
//     const rightChar = s[right].toLowerCase()

//     // 如果不是字母就继续向后移动
//     if (!/[a-zA-Z0-9]/.test(leftChar)) {
//       left++
//     }
//     if (!/[a-zA-Z0-9]/.test(rightChar)) {
//       right--
//     }

//     if (/[a-zA-Z0-9]/.test(leftChar) && /[a-zA-Z0-9]/.test(rightChar)) {
//       if (leftChar !== rightChar) {
//         return false
//       }
//       left++
//       right--
//     }
//   }
//   return true
// }

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function (s) {
  const n = s.length
  if (!n) {
    return false
  }
  let left = 0,
    right = n - 1
  let flag = true
  const pattern = /^[0-9a-zA-Z]+$/
  while (left < right) {
    if (!pattern.test(s[left])) {
      left++
      continue
    }
    if (!pattern.test(s[right])) {
      right--
      continue
    }
    if (s[left].toLowerCase() !== s[right].toLowerCase()) {
      flag = false
      return flag
    }
    left++
    right--
  }
  return flag
}
